package com.demo.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

/**
 * @author wang
 */
@Slf4j
public class MD5Util {

  /**
   * MD5加密
   *
   * @param data
   * @return
   */
  public static String MD5(String data) {
    try {
      MessageDigest md = MessageDigest.getInstance("MD5");
      byte[] array = md.digest(data.getBytes(StandardCharsets.UTF_8));
      StringBuilder sb = new StringBuilder();
      for (byte item : array) {
        sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
      }
      return sb.toString().toUpperCase();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }

  /**
   * 对字符串md5加密(小写+字母)
   *
   * @param str 传入要加密的字符串
   * @return MD5加密后的字符串
   */
  public static String md5(String str) {
    try {
      // 生成一个MD5加密计算摘要
      MessageDigest md = MessageDigest.getInstance("MD5");
      // 计算md5函数
      md.update(str.getBytes());
      // digest()最后确定返回md5 hash值，返回值为8为字符串。因为md5 hash值是16位的hex值，实际上就是8位的字符
      // BigInteger函数则将8位的字符串转换成16位hex值，用字符串来表示；得到字符串形式的hash值
      return new BigInteger(1, md.digest()).toString(16);
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  }

  /**
   * md5转小写
   *
   * @param s
   * @return
   */
  public static String MD5LowerCase(String s) {
    String md5 = MD5(s);
    if (StringUtils.isBlank(md5)) {
      return null;
    }
    return md5.toLowerCase();
  }

  public static void main(String[] args) {
    log.info(MD5Util.MD5("wang123"));
    log.info(MD5Util.md5("wang123"));
    log.info(MD5Util.MD5LowerCase("wang123"));
  }

}
 
